package com.test.demo.utils;

import java.time.*;
import java.util.Date;

/**
 * 日期类型快速构建器
 */

public class DateBuilder {
    private DateBuilder() {
    }

    private static Instant instant;
    private final static ZoneId zone;

//    static {
//        // TODO  这里本打算用静态代码块初始化 但是这里的代码会优先于类执行 所以这里的instant会报空指针异常
    // 暂时这里换做其他方式执行 抽取公共方法加私有化参数的形式
//        instant = date.toInstant();
//        zone = ZoneId.systemDefault();
//
//
//    }

    static {
        // 静态代码块进行构造 刚开始的方案是把它放入私有的构造方法进行初始化,但是没有值,
        // 想了一下原因,因为工具类现在调用的都是静态的方法,所以当调用方法时并没有走构造方法
        // 所以可能会出现没有值的现象 也因此暂时用静态代码块进行初始化
        zone = ZoneId.systemDefault();
    }

    /**
     * 这个为工具类的初始化方法 仅限于本工具类使用 所以这里需要私有化
     *
     * @param data object类型
     */
    private static void initialize(Object data) {
        // 这里最好肯定是用switch 因为这里数据类型比较多
        // 但是switch传入的值的类型有限制 所以这里选择只能用if
        if (data instanceof Date) {
            instant = ((Date) data).toInstant();
        } else if (data instanceof LocalDate) {
            instant = ((LocalDate) data).atStartOfDay().atZone(zone).toInstant();
        } else if (data instanceof LocalDateTime) {
            instant = ((LocalDateTime) data).atZone(zone).toInstant();
        }
    }

    /**
     * date 转化 localDateTime
     *
     * @param date date类型日期
     * @return
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        initialize(date);
        return LocalDateTime.ofInstant(instant, zone);
    }

    /**
     * date 转 localDate
     *
     * @param date date类型日期
     * @return
     */
    public LocalDate dateToLocalDate(Date date) {
//        Instant instant = date.toInstant();
//        ZoneId zone = ZoneId.systemDefault();
//        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
//        LocalDate localDate = localDateTime.toLocalDate();
        return dateToLocalDateTime(date).toLocalDate();
    }

    /**
     * date 转 localTime
     *
     * @param date date类型日期
     * @return
     */
    public static LocalTime dateToLocalTime(Date date) {
        return dateToLocalDateTime(date).toLocalTime();
    }

    /**
     * 快速构建指定年月日的date类型
     *
     * @param year  年
     * @param mouth 月
     * @param day   日
     * @return
     */
    public static Date creatDateByLocalDate(int year, int mouth, int day) {
        LocalDate localDate = LocalDate.of(year, mouth, day);
        initialize(localDate);
        return Date.from(instant);
    }

    /**
     * 快速构建指定年月日时分的date类型
     *
     * @param year   年
     * @param mouth  月
     * @param day    日
     * @param hour   时
     * @param minute 分
     * @return
     */
    public static Date creatDateByLocalDateTime(int year, int mouth, int day, int hour, int minute) {
        LocalDateTime localDateTime = LocalDateTime.of(year, mouth, day, hour, minute);
        initialize(localDateTime);
        return Date.from(instant);
    }
}
